﻿package 
{
	import flash.events.*;
	public class TraitementMessage extends EventDispatcher
	{
		public var msg:String;
		public var dialogue:String;
		public var qui:String;
		public var msgRecu:XML;
		public var mainRecu:Array;
		public var statusRecu:int;
		public var atout:String;
		public var joueur:Array;
		public var jeuCarte:Carte;
		public var scoreRecu:Array;
		
		public static const STATUSRECU:String = "status recu";
		public static const ENVOIPRET:String = "envoiPret";
		public static const DIALOGUERECU:String = "dialogue recu";
		public static const MAINRECU:String = "main recue";
		public static const SCORERECU:String = "score recu";
		public static const ATOUTRECU:String = "atout recu";
		public static const COULEURRECU:String = "couleur recue";
		public static const JOUEURRECU:String = "joueur recu";
		public static const PLIRECU:String = "pli recu";
		public static const RAZ:String = "raz";
		public static const GAGNER:String = "gagner";
		
		public function TraitementMessage(crt:Carte)
		{
			this.jeuCarte = crt;
			joueur = new Array(2);
			this.scoreRecu = new Array(2);
		}
		public function lecture(xml:XML)
		/*lecture du xml et analyse de la balise pour redirection vers les objets concernés*/
		{
			trace("message recu : "+xml);
			var main:XMLList;
			var cpt:int;
			this.msgRecu=xml;
			
			//trace("action.name="+action.name().localName);
			var actions:XMLList =xml.elements();
			trace("affichage des actions");
			
			for each (var action:XML in actions)
			{
				switch (action.name().localName)
				{
					case "CONNEXION":
						
						jeuCarte.idConnexion=action.@id;
						trace("recuperation de l'id connexion du joueur ==> "+action.@id+" <==");
						envoyerId(jeuCarte.monPseudo);
						break;
						
					case "IDJEU":
						jeuCarte.idJoueur=action;
						trace("recuperation de l'idJeu du joueur ==> "+action+" <==");
						break;
					case "DIT":
						dialogue="<b>"+action.@qui+"</b> : "+action.@quoi;
						dispatchEvent ( new Event (TraitementMessage.DIALOGUERECU) );
						break;
					
					case "MAIN":
						trace("main recue");
						mainRecu = new Array();
						if (action != "0")
						{
							main=action.elements();
							cpt=0;
							for each (var carte:XML in main)
							{
								var isJouable:Boolean=false;
								trace("carte numero="+carte.@numero+" couleur="+carte.@couleur);
								if (carte.@jouable=="true")
								{
									isJouable=true;
								}
								mainRecu[cpt]= {numero : carte.@numero, couleur : carte.@couleur, jouable : isJouable};
								trace("contenu de mainRecu : "+mainRecu[cpt].numero+" "+mainRecu[cpt].couleur+" "+mainRecu[cpt].jouable);
								cpt++;
							}
							dispatchEvent ( new Event (TraitementMessage.MAINRECU) );
						}
						else
						{
							this.jeuCarte.newMsg("[DEBUG] Main vide recu");
						}
						// tri des cartes
						//triMain();
						
						
						break;
						
					case "PLI":
						trace("pli recu");
						mainRecu = new Array();
						this.jeuCarte.newMsg("action="+action);
						cpt = 0;
						//TODO essayer de regler leprobleme de reception de pli vide (tenté ici avec le if et le try)
						try
						{
							if (action!= "0")
							{
								main=action.elements();
								for each (var carte2:XML in main)
								{
							
									trace(carte2.@qui+"carte numero="+carte2.@numero+" couleur="+carte2.@couleur);

									mainRecu[cpt]= {qui : carte2.@qui , numero : carte2.@numero, couleur : carte2.@couleur};
									trace("contenu du pliRecu : "+mainRecu[cpt].numero+" "+mainRecu[cpt].couleur);
									cpt++;
								}
							}
							else
							{
								this.jeuCarte.newMsg("[DEBUG] Pli vide recu");
								
							}
						}
						catch (error:Error)
						{
							this.mainRecu = null;
						}
						dispatchEvent ( new Event (TraitementMessage.PLIRECU) );
						break;
					
					case "STATUS":
						statusRecu=parseInt(action);
						if (statusRecu!=jeuCarte.statusJeu)
						//si le status recu est différent du status en cours :
						{
							jeuCarte.statusJeu=statusRecu;
							dispatchEvent ( new Event (TraitementMessage.STATUSRECU) );
						}
						
						break;
					case "SCORE":
						trace("score equipe1="+action.@equipe1+" equipe2="+action.@equipe2);
						scoreRecu[0] = action.@equipe1;
						scoreRecu[1] =action.@equipe2;
						dispatchEvent ( new Event (TraitementMessage.SCORERECU) );
						break;
					case "ATOUT":
						mainRecu[0]={numero : action.@numero, couleur : action.@couleur};
						dispatchEvent ( new Event (TraitementMessage.ATOUTRECU) );
						break;
					case "COULEUR":
						//reception de la couleur d'atout
						this.qui=action.@qui;
						this.atout=action.@atout;
						dispatchEvent ( new Event (TraitementMessage.COULEURRECU) );
						break;
					case "JOUEUR":
						//reception des informations sur un joueur
						this.joueur[0]={id : action.@id, nom : action.@nom };
						trace("this.joueur[0]"+this.joueur[0].id+" "+this.joueur[0].nom);
						dispatchEvent ( new Event (TraitementMessage.JOUEURRECU) );
						break;
					case "FULL":
						//TODO le serveur est plein -> deconnexion
						break;
					case "RAZ":
						dispatchEvent(new Event (TraitementMessage.RAZ));
						break;
					case "GAGNER":
						this.qui = action;
						trace(action);
						dispatchEvent(new Event (TraitementMessage.GAGNER));
						break;
					case "WARNING":
						this.jeuCarte.newMsg(action);
						break;
					default:
					trace ("balise inconnue : "+action.name().localName)
				}
			}

		}
		
		public function triMain()
		{
			
			//mainRecu[cpt]= {numero : carte.@numero, couleur : carte.@couleur, jouable : isJouable};
			//algo pourri a refaire
			var place:int;
			var couleur:int;
			var tabCarte = new Array(4);
			for (var numCoul:int = 0; numCoul < 4; numCoul++)
			{
				tabCarte[numCoul] = new Array( "-", "-", "-", "-", "-", "-" );
			}
			
			for (var cpt1:int=0;cpt1<this.mainRecu.length;cpt1++)
			{
				switch (this.mainRecu[cpt1].numero.toUpperCase())
				{
					case "ROI" : 
						place = 0;
						break;
					case "DAME" :
						place = 1;
						break;
					case "VALET" :
						place = 2;
						break;
					case "10" : 
						place = 3;
						break;
					case "9" :
						place = 4;
						break;
					case "8" :
						place = 5;
						break;
					case "7" :
						place = 6;
						break;
					default :
						trace("[ERREUR] numéro non pris en compte : "+this.mainRecu[cpt1].numero+", classement impossible");
						
						
				}
				switch (this.mainRecu[cpt1].couleur.toUpperCase())
				{
					case "COEUR" :
						couleur = 0;
						break;
					case "PIQUE" :
						couleur = 1;
						break;
					case "CARREAU" :
						couleur = 2;
						break;
					case "TREFLE" :
						couleur = 3;
						break;
					default :
						trace("[ERREUR] couleur non prise en compte : "+this.mainRecu[cpt1].couleur+", classement impossible");
						
				}
				tabCarte[couleur][place] = this.mainRecu[cpt1];
				
			}
			this.mainRecu = new Array();
			for (couleur = 0; couleur < 4; couleur++)
			{
				for (place = 0; place < 7; place++)
				{
					if (tabCarte[couleur][place] != "-")
					{
						this.mainRecu.push(tabCarte[couleur][place]);
					}
				}
			}
			
		}
		public function connexionOK()
		{
			msg = "<CONNEXION quoi=\"OK\" />";
			trace(msg);
			dispatchEvent ( new Event (TraitementMessage.ENVOIPRET) );
		}
		private function ecrireDuText(xml:XML)
		/*ecriture du texte dans l'historique des messages*/
		{
			
		}
		public function envoyerTexte(message:String)
		{
			msg = "<DIT qui=\""+jeuCarte.idJoueur+"\" quoi=\""+message+"\" />";
			trace(msg);
			dispatchEvent ( new Event (TraitementMessage.ENVOIPRET) );
		}
		public function envoyerCoupe(message:String)
		{
			msg = "<COUPE qui=\""+jeuCarte.idJoueur+"\" quoi=\""+message+"\" />";
			trace(msg);
			dispatchEvent ( new Event (TraitementMessage.ENVOIPRET) );
		}
		
		
		public function accepteAtout(carte:CarteAJouer)
		{
			msg = "<ATOUT qui=\""+jeuCarte.idJoueur+"\" numero=\""+carte.numero+"\" couleur=\""+carte.couleur+"\" />";
			trace(msg);
			dispatchEvent ( new Event (TraitementMessage.ENVOIPRET) );
		}
		public function refuseAtout()
		{
			msg = "<ATOUT qui=\""+jeuCarte.idJoueur+"\" quoi=\""+"passer"+"\" />";
			trace(msg);
			dispatchEvent ( new Event (TraitementMessage.ENVOIPRET) );
		}
		
		
		public function envoyerCoupJoué(carte:CarteAJouer)
		{
			msg = "<JOUER qui=\""+jeuCarte.idJoueur+"\" numero=\""+carte.numero+"\" couleur=\""+carte.couleur+"\" />";
			trace(msg);
			dispatchEvent ( new Event (TraitementMessage.ENVOIPRET) );
		}
		
		
		public function envoyerId(nom:String)
		{
			msg = "<CONNEXION qui=\""+jeuCarte.idConnexion+"\" quoi=\""+nom+"\" />";
			trace(msg);
			dispatchEvent ( new Event (TraitementMessage.ENVOIPRET) );
		}
	}
}